home *** CD-ROM | disk | FTP | other *** search
-
- ; NewEx_Sw.asm 90-06-11 Version V1.1
- ;
- ; New Executeing program
- ;
- ; Written by Kjell Cederfeldt in June - 90.
- ;
- ExecBase = 4
- OpenLibrary = -408 ; exec offset OpenLibrary(libName,version)(A1,D0)
- CloseLibrary = -414 ; exec offset CloseLibrary(library)(a1)
- FindTask = -294 ; exec offset FindTask(name)(a1)
- WaitPort = -384 ; exec offset WaitPort(port)(a0)
- GetMsg = -372 ; exec offset GetMsg(port)(a0)
- ReplayMsg = -378 ; exec offset ReplayMsg(message)(a1)
- Forbid = -132 ; exec offset Forbid()
- Open = -30 ; dos offset Open(name,accessMode)(D1/D2)
- Close = -36 ; dos offset Close(file)(D1)
- Write = -48 ; dos offset Write(file,buffer,length)(d1/d2/d3)
- OutPut = -60 ; dos offset OutPut()
- Lock = -84 ; dos offset! Lock(name,mode)(d1,d2)
- UnLock = -90 ; dos offset! UnLock(lock)(d1)
- Examine = -102 ; dos offset! Examine(Lock,InfoBlock)(d1,d2)
- CurrentDir = -126 ; dos offset CurrentDir(lock)(d1)
- ParentDir = -210 ; dos offset! ParentDir(lock)(d1)
- Execute = -222 ; dos offset Execute(string,file,file)(D1/D2/D3)
- GetDiskObject = -78 ; icon offset GetDiskObject(name)(a0)
- FindToolType = -96 ; icon offset FindToolType(toolTypeArray,typeName)(A0/A1)
- FreeDiskObject = -90 ; icon offset FreeDiskObject(diskobj)(a0)
- Mode_old = 1005 ;
- Mode_new = 1006 ;
- Access_read = -2
-
- move.l sp,Initial_SP ;Spara stackpekaren
- move.l a0,Filename ;CLI=true spara adress till agument
- sub.l #1,d0 ;Minska längden med 1
- add.l d0,a0 ;Addera längden till adressen
- move.b #0,(a0) ;Nolla sista byten (CLI=0A)
- move.l #0,RetCode ;Nolla Returncode
-
- START: move.l ExecBase,a6
- suba.l a1,a1 ;Hitta detta Task
- jsr Findtask(a6)
- move.l d0,a4 ;Spara strukturen i a4
- tst.l $ac(a4) ;CLI eller WB ?
- bne CliStart ;
-
-
- ; ** Detta endast om start från WB
-
-
- move.l #49,RetCode ;Sätt Returncode
- lea $5c(a4),a0 ;WBench message
- jsr WaitPort(a6) ;vänta
- jsr GetMsg(a6) ;hämta message
- move.l d0,Message ;spara pekare till WBMessage
- beq Slut ;error!
-
- move.l #48,RetCode ;Sätt Returncode
- move.l Message,a0 ;Pekare till WBMessage
- move.l $24(a0),a0 ;Argumentlista
- beq Slut2 ;inga agument
-
- CliStart:
-
-
- ; Öppna icon.library
-
- move.l #47,RetCode ;Sätt Returncode
- lea Iconname(pc),a1 ;Ladda adressen för IconName i a1
- clr.l d0 ;Tillåt alla versioner
- jsr OpenLibrary(a6) ;öppna iconlibrary
- move.l d0,Iconbase ;Spara Iconbase
- beq Error1 ;Hoppa om fel!
-
-
- ; Öppna dos.library
-
- move.l #46,RetCode ;Sätt Returncode
- lea Dosname(pc),a1 ;Ladda adressen för DosName i a1
- clr.l d0 ;Tillåt alla dosversioner
- jsr OpenLibrary(a6) ;öppna doslibrary
- move.l d0,Dosbase ;Spara Dosbase
- beq Error2 ;Hoppa om fel!
-
-
- jsr PointTOCLI
-
- tst.l Message ;Om start från CLI
- beq InFileOpen ;Hopp till FileOpens
-
- ; ställ Current directory
-
- move.l #45,RetCode ;Sätt Returncode
- move.l Message,a0 ;Pekare till WBMessage sm_ArgList
- move.l $24(a0),a0 ;flytta pekaren till wa_Lock
- beq Error3 ;Error!
-
- move.l (a0),d1 ;D1 => Lock
- move.l Dosbase,a6
- jsr CurrentDir(a6) ;Lås Current Dir
-
- ; Hämta diskobject (.info fil)
-
- move.l #44,RetCode ;Sätt Returncode
- move.l Message,a0
- move.l $24(a0),a0
- move.l 4(a0),a0 ;flytta pekaren till wa_Name
- move.l a0,Filename
- move.l Iconbase,a6
- jsr GetDiskObject(a6) ;Hämta diskobject
- move.l d0,Diskobj ;Spara undan diskobjectet
- beq Error3 ;Error!
- move.l d0,a1
- move.l $36(a1),a1 ;pekare till ToolType Array
- move.l a1,toolTypeArray ;spara pekaren
-
-
-
- ; *** Hämta argument från tool icon (tooltype)
-
- move.l Iconbase,a6
- move.l toolTypeArray,a0
- move.l #typeName1,a1
- jsr FindToolType(a6)
- move.l d0,Inname
-
- move.l toolTypeArray,a0
- move.l #typeName2,a1
- jsr FindToolType(a6)
- move.l d0,Outname
-
-
- ; öppna utfil
- move.l #43,RetCode ;Sätt Returncode
- move.l DosBase,a6 ;Hämta dosbasen
- move.l Outname,d1 ;Hämta filnamn
- move.l #Mode_new,d2 ;1006=NewFile: 1005=Existing file
- jsr Open(a6) ;öppna filen
- move.l d0,Outhandle ;Spara filhateraren
- beq Error3 ;Hoppa om fel!
-
- ;-------
- ; öppna läsfil
- ;-------
- InFileOpen:
-
- move.l #42,RetCode ;Sätt Returncode
- move.l Filename,d1 ;Hämta filnamn
- tst.l Message ;Koll om Start WB el CLI?
- beq.s InopLab ;Hopp, om CLI
- move.l Inname,d1 ;Hämta filnamn
- InOpLab: move #Mode_old,d2 ;1005=Existing file : 1006=NewFile
- move.l DosBase,a6 ;Hämta dosbasen
- jsr Open(a6) ;öppna filen
- move.l d0,Inhandle ;Spara filhateraren
- bne BldPath ;Hoppa om ej fel!
-
- tst.l Message ;Koll om Start WB el CLI?
- bne.s Err ;Hopp, om WB
- move.l CLIpoint,d1
- move.l #Textfld,d2
- move.l #84,d3
- jsr Write(a6)
- Err: bra Error4
-
-
- ; Hämta och bygg sökväg.
-
- BldPath: jsr GetPath ;bygg path
-
-
- Skriv: ; Detta är bra vid buggning (används ej i programmet)
- move.l Dosbase,a6
- ; move.l CLIpoint,d1
- ; tst.l Message ;Koll om Start WB el CLI?
- ; beq.s Skr ;Hopp till End om CLI
- ; move.l Outhandle,d1
- ;Skr: move.l #path,d2
- ; move.l #255,d3 ;sträng längd
- ; jsr Write(a6)
- ;--------
- ; anroppa Execute (dosfunktion)
- ;--------
- move.l #0,RetCode ;Nolla Returncode
- move.l CLIPoint,d3
-
- tst.l Message ;Koll om Start WB el CLI?
- beq.s Exlabel ;Hopp till End om CLI
-
- move.l Outhandle,d3 ;hämta fil hanterare
- Exlabel: move.l PathStart,d1 ;hämta pekare för sträng
- move.l InHandle,d2 ;hämta fil hanterare
- jsr Execute(a6) ;exectue a scripfile (dos)
-
-
- ;---------
- ; Stäng filer
- ;---------
-
- Cleanup1: move.l Inhandle,d1
- jsr Close(a6)
-
- Error4: tst.l Message ;Koll om Start WB el CLI?
- beq.s temp ;Hopp till End om CLI
-
- move.l Outhandle,d1
- jsr Close(a6)
-
-
- Error3: move.l Iconbase,a6 ;Hämta Iconbase
- move.l Diskobj,a0 ;Hämta diskobject strukturen
- jsr FreeDiskobject(a6) ;Frigör Diskobject
-
- temp: move.l Dosbase,a1 ;Hämta Dosbase
- move.l Execbase,a6
- jsr CloseLibrary(a6) ;stäng Doslibrary:
-
- Error2: move.l Iconbase,a1 ;Hämta IconBase
- move.l Execbase,a6
- jsr CloseLibrary(a6) ;Stäng Iconlibrary
-
-
- Error1: tst.l Message ;Koll om Start WB el CLI?
- beq.s Slut ;Hopp till End om CLI
- Slut2: jsr Forbid(a6)
- move.l Message,a1
- jsr ReplayMsg(a6) ;lämna tillbaka struktur
-
- Slut: move.l Initial_SP,sp ;Hämta start stacken
- clr.l d0
- move.l RetCode,d0 ;Hämta returncode till D0
- rts
-
- ; !! *********** System DATA ************** !!
-
- Initial_SP: dc.l 0
- RetCode: dc.l 0
- Iconbase: dc.l 0
- Dosbase: dc.l 0
- Inhandle: dc.l 0
- Outhandle: dc.l 0
- Message: dc.l 0
- Diskobj: dc.l 0
- CLIpoint: dc.l 0
- Filename: dc.l 0
- NewLock: dc.l 0
- ParLock: dc.l 0
- Inname: dc.l 0
- Outname: dc.l 0
- Pathstart: dc.l 0
- Dosname: dc.b 'dos.library',0
- align
- Iconname: dc.b 'icon.library',0
- align
- TempNamn: blk.b 32,0
- align
- Path: blk.b 255,0
- align
- typeName1: dc.b "FILENAME",0,0
- align
- typeName2: dc.b "WINDOW",0,0
- align
- Textfld: dc.b 27,"[33mNewEx Version 1.1 by Kjell Cederfeldt",13,10,10
- dc.b "No file name or file not found!",27,"[31m",13,10,10
- align
- toolTypeArray: dc.l 0
- IconText: dc.l 0
- FileInfoblock: blk.b 260,0
- align
-
- ; ReturnCode 47 = icon.library ej öppnad
- ; ReturnCode 46 = dos.library ej öppnad
- ; ReturnCode 45 = currentdir ej låst
- ; ReturnCode 44 = diskobjekt ej hittad
- ; ReturnCode 43 = utfil (enhet) ej funnen
- ; ReturnCode 42 = infil (enhet) ej funnen
-
- ;******************** Subrutiner ***************************************
-
- PointTOCLI:
-
- ; Output funktionen är bra om man vill skriva text ut i cli-fönstret som man startade i
-
- move.l Dosbase,a6 ;doslibrary pekare till
- jsr OutPut(a6) ;hämta output pekare till Dos!
- move.l d0,CLIpoint ;Spara undan pekaren
- rts
-
- ;***************************************************************************
-
- GetPath:
- move.l #Path,d2 ;peka på adressen till Path
- add.l #253,d2 ;peka på slutet -2 (" + terminering)
- move.l d2,PathStart ;Tala om var start på path
- ;stängen börjar
-
- move.l Dosbase,a6 ;Hämta dosbase
- move.l #Filename,d1 ;hämta pekare till filnamn
- move.l Access_read,d2 ;läs-mode endast
- jsr Lock(a6) ;lås!
- tst.l d0
- beq EndLoop ;Ingen Fil hittades
- move.l d0,NewLock ;spara låset
-
- MainLoop: move.l NewLock,d1 ;Hämta låset
- move.l #Fileinfoblock,d2 ;hämta adress till block
- jsr Examine(a6) ;Hämta filinfo
- tst.l d0
- beq EndLoop
-
- move.l #Fileinfoblock,d2
- add.l #8,d2 ;Addera offset till adressen
-
- clr.l d0 ;Nollställ räknare
- move.l d2,a0 ;flytta filpekaren till A0
- move.l #Tempnamn,a1 ;flytta pathpekare till A1
- Loop: move.b (a0)+,(a1)+ ;flytta innehåll A0 => A1
- add.l #1,d0 ;öka räknaren
-
- tst.b (a0) ;Namnet slut? (0 terminering)
- bne.s Loop ;Nej hoppa till loop
-
- move.b #47,(a1)+ ;lägg till en '/'
- add.l #1,d0 ;öka räknaren
-
- move.l Pathstart,d2 ;hämta Path start
- move.l d2,a0
-
- Loop2: move.b -(a1),-(a0) ;spara path-stukturen till Path
- sub.l #1,d0 ;backa räknaren
- bne.s Loop2
-
- move.l a0,Pathstart ;spara nuvarade pathstart
-
- move.l NewLock,d1 ;Hämta låset
- jsr ParentDir(a6) ;gå till tidigare dir
- move.l d0,ParLock ;spara låset
- move.l NewLock,d1 ;Hämta föregående lås
- jsr UnLock(a6) ;Släpp låset
- move.l ParLock,d0 ;hämta nuvarnde lås
- move.l d0,NewLock ;och flytta detta
- tst.l d0 ;är vi i root ?
- bne MainLoop ;Nej hoppa
-
- move.l PathStart,a1 ;hämta pathstart
- Kolon: cmp.b #47,(a1)+ ;hitta första '/'
- bne.s kolon
- move.b #58,-(a1) ;Byt detta mot ':'
-
- move.l PathStart,a1 ;hämta pathstart
- move.b #34,-(a1) ;lägg till '"'
- move.b #32,-(a1) ;lägg till ' '
- move.b #68,-(a1) ;lägg till 'D'
- move.b #67,-(a1) ;lägg till 'C'
- move.l a1,PathStart ;spara den nya starten
- move.l #Path,a1
- add.l #253,a1
- move.b #34,(a1)
-
- Endloop: rts
-
- ;***************************************************************************
- end
-